home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 3 / Amiga Tools 3.iso / programming / colpectius1 / text_editor.amos / text_editor.amosSourceCode
AMOS Source Code  |  1993-08-18  |  8KB  |  360 lines

  1. ' A text editor
  2. ' ~~~~~~~~~~~~~
  3. ' by Ben Wyatt, bwyatt@paston.co.uk
  4.  
  5. ' A text editor with very nasty colours and many options which just don't
  6. ' work, and is limited to 200 lines (you can change this, look below)
  7. ' Since I did this, I've done a proportional font text editor which is 
  8. ' much better, but it's not finished (yet) 
  9.  
  10. Set Buffer 15
  11.  
  12. LINES=200 : L=0 : YPOS=0
  13. Dim LINE$(LINES)
  14. Global LINES,TSCRHEIGHT,L,YPOS,FILENAME$
  15. Global LINE$()
  16.  
  17. _TEXTEDITOR[0]
  18. Edit 
  19.  
  20. Procedure _TEXTEDITOR[SCR]
  21.    
  22.    '   Scr=Spare screen to be used
  23.    
  24.    Screen Open SCR,640,256,8,Hires
  25.    Screen Display 0,128,37,640,Screen Height
  26.    Palette $0,$40F,$A0F,,$FFF
  27.    Cdown 
  28.    Cls 1
  29.    Cls 2,0,0 To 640,8
  30.    Cls 2,624,8 To 640,Screen Height
  31.    TSCRHEIGHT=Screen Height/8-1
  32.    Scroll Off 
  33.    _LMOUSE
  34.    
  35.    Def Scroll 1,0,8 To 624,Screen Height,0,8
  36.    Def Scroll 2,0,16 To 624,Screen Height,0,-8
  37.    
  38.    Paper 1 : Pen 4
  39.    
  40.    Menu$(1)=" Project "
  41.    Menu$(1,1)=" Load    "
  42.    Menu$(1,2)=" Save    "
  43.    Menu$(1,3)=" Save As "
  44.    Menu$(1,4)=" " : Menu Inactive(1,4)
  45.    Menu$(1,5)=" Print   "
  46.    Menu$(1,7)=" " : Menu Inactive(1,7)
  47.    Menu$(1,20)=" Quit    "
  48.    
  49.    Menu$(2)=" Block "
  50.    Menu$(2,1)=" Select All "
  51.    Menu$(2,3)=" " : Menu Inactive(2,3)
  52.    Menu$(2,4)=" Copy       "
  53.    Menu$(2,5)=" Cut        "
  54.    Menu$(2,6)=" Delete     "
  55.    
  56.    Menu$(3)=" Search "
  57.    Menu$(3,1)=" Search New       "
  58.    Menu$(3,2)=" Search Next      "
  59.    Menu$(3,3)=" Search Previous  "
  60.    Menu$(3,5)=" " : Menu Inactive(3,5)
  61.    Menu$(3,6)=" Replace New      "
  62.    Menu$(3,7)=" Replace Next     "
  63.    Menu$(3,8)=" Replace Previous "
  64.    
  65.    Menu On 
  66.    
  67.    _TEXTUPDATE[0]
  68.    _CURSPOS
  69.    
  70.    Repeat 
  71.       
  72.       If Choice
  73.          
  74.          C1=Choice(1)
  75.          C2=Choice(2)
  76.          Menu Off 
  77.          
  78.          If C1=1
  79.             If C2=1
  80.                _LOAD[Fsel$("","","Select a Text file to Load","")]
  81.                _TEXTUPDATE[YPOS]
  82.             End If 
  83.             If C2=2
  84.                _SAVE[FILENAME$]
  85.                _TEXTUPDATE[YPOS]
  86.             End If 
  87.             If C2=3
  88.                FILENAME$="" : _SAVE[FILENAME$]
  89.                _TEXTUPDATE[YPOS]
  90.             End If 
  91.          End If 
  92.  
  93.          If C1=2
  94.          End If 
  95.  
  96.          If C1=3
  97.          End If 
  98.  
  99.          Menu On 
  100.          Clear Key 
  101.          
  102.       End If 
  103.  
  104.       X=X Screen(X Mouse) : Y=Y Screen(Y Mouse) : MC=Mouse Click : MK=Mouse Key
  105.       If MC=1 and Y>7
  106.          XC=X/8 : YC=Y/8
  107.          L=YPOS+YC-1
  108.          Locate Min(XC,Len(LINE$(L))),YC
  109.       End If 
  110.  
  111.       I$=Inkey$ : S=Scancode : A=Asc(I$) : SS=Scanshift
  112.       If A>0 or S>0 : _CHECK[I$,A,S,SS] : End If 
  113.       
  114.    Until C1=1 and C2=20
  115.    
  116. End Proc
  117. Procedure _TEXTUPDATE[ST]
  118.    
  119.    ' St=Start of text to print
  120.  
  121.    Cls 1,0,8 To 624,Screen Height
  122.  
  123.    X=X Curs : Y=Y Curs
  124.    Paper 1 : Pen 4
  125.  
  126.    For YPL=ST To ST+TSCRHEIGHT-1
  127.       Locate 0,YPL-ST+1
  128.       Print LINE$(YPL)
  129.    Next YPL
  130.  
  131.    Locate X,Y
  132.  
  133. End Proc
  134.  
  135. Procedure _LOAD[FILE$]
  136.    
  137.    If Exist(FILE$)=0 and FILE$<>""
  138.       _ERROR["File Doesn't Exist",7] : FILE$=""
  139.    End If 
  140.    If FILE$<>""
  141.       Reserve As Chip Data 12, Extension_18_0294(FILE$)
  142.       _PRINTFILE[FILE$] : Bload FILE$,12
  143.       PL=Start(12)
  144.       For N=0 To LINES
  145.          LINE$(N)=""
  146.          If PL<Start(12)+Length(12)
  147.             LINE$(N)= Extension_18_013A(PL,78,Chr$(10))
  148.             Add PL,Len(LINE$(N))+1
  149.          End If 
  150.       Next N
  151.       
  152.       Erase 12
  153.       L=0 : YPOS=0
  154.       
  155.    End If 
  156.    
  157. End Proc
  158. Procedure _SAVE[FILENAME$]
  159.  
  160.    X=X Curs : Y=Y Curs
  161.    
  162.    If FILENAME$=""
  163.       FILENAME$=Fsel$("","","Input Filename to Save Under","")
  164.    End If 
  165.  
  166.    Reserve As Chip Data 12,78*LINES
  167.    PL=Start(12)
  168.    For N=0 To LINES
  169.        Extension_18_015A PL,LINE$(N)+Chr$(10)
  170.       Add PL,Len(LINE$(N))+1
  171.    Next N
  172.    Bsave FILENAME$,Start(12) To PL
  173.    Erase 12
  174.  
  175.    _PRINTFILE[FILENAME$]
  176.    Locate X,Y
  177.  
  178. End Proc
  179.  
  180. Procedure _ERROR[MESS$,SCR]
  181.  
  182.    S=Screen
  183.  
  184.    Screen Open SCR,640,8,2,Hires
  185.    Flash Off : Curs Off : Cls 0
  186.    Centre MESS$
  187.  
  188.    Repeat : Until Mouse Key>0
  189.  
  190.    Screen Close SCR
  191.    Screen S
  192.  
  193. End Proc
  194. Procedure _LMOUSE
  195.    Limit Mouse 130,39 To 128+318,37+Screen Height-2
  196. End Proc
  197. Procedure _CHECK[I$,A,S,SS]
  198.  
  199.    X=X Curs
  200.  
  201.    ' Normal Key 
  202.    If A>31 and Len(LINE$(L))<77
  203.       A1$=Left$(LINE$(L),X)
  204.       A2$=Right$(LINE$(L),Len(LINE$(L))-X)
  205.       LINE$(L)=A1$+I$+A2$
  206.       Inc X
  207.       Locate 0,Y Curs
  208.       Print LINE$(L);
  209.       Locate X,Y Curs
  210.    End If 
  211.    
  212.    ' Delete 
  213.    If A=8 and(L>0 or X>0)
  214.       If X=0
  215.          A1$=LINE$(L-1)
  216.          A2$=LINE$(L)
  217.          If Len(A1$+A2$)<=77
  218.             For N=L+1 To LINES
  219.                LINE$(N-1)=LINE$(N)
  220.             Next N
  221.             LINE$(LINES)=""
  222.             LINE$(L-1)=A1$+A2$
  223.             Dec L
  224.             If Y Curs=1
  225.                Curs Off : Wait Vbl 
  226.                Scroll 1 : Dec YPOS
  227.                Cls 1,0,8 To 624,16
  228.                Locate 0,1 : Print LINE$(L);
  229.                Curs On 
  230.             Else Cup 
  231.             End If 
  232.             Y=Y Curs
  233.             Def Scroll 3,0,Y*8+8 To 624,Screen Height,0,-8
  234.             Scroll 3
  235.             Locate 0,Y : Print LINE$(L);
  236.             Cls 1,0,248 To 624,256
  237.             Locate 0,TSCRHEIGHT : Print LINE$(YPOS+TSCRHEIGHT-1);
  238.             Locate Len(A1$),Y
  239.             Clear Key 
  240.          End If 
  241.       Else 
  242.          A1$=Left$(LINE$(L),X-1)
  243.          A2$=Right$(LINE$(L),Len(LINE$(L))-X)
  244.          LINE$(L)=A1$+A2$
  245.          Dec X
  246.          Locate 0,Y Curs
  247.          Print LINE$(L)+" ";
  248.          Locate X,Y Curs
  249.       End If 
  250.    End If 
  251.  
  252.    ' Backspace
  253.    If S=70 and X<Len(LINE$(L))
  254.       A1$=Left$(LINE$(L),X)
  255.       A2$=Right$(LINE$(L),Len(LINE$(L))-X-1)
  256.       LINE$(L)=A1$+A2$
  257.       Locate 0,Y Curs
  258.       Print LINE$(L)+" ";
  259.       Locate X,Y Curs
  260.    End If 
  261.  
  262.    ' Return 
  263.    If A=13 and LINE$(LINES)=""
  264.       A1$=Left$(LINE$(L),X)
  265.       A2$=Right$(LINE$(L),Len(LINE$(L))-X)
  266.       LINE$(L)=A1$
  267.       For N=LINES-1 To L+1 Step -1
  268.          LINE$(N+1)=LINE$(N)
  269.       Next N
  270.       If Y Curs=TSCRHEIGHT
  271.          Curs Off : Wait Vbl 
  272.          Scroll 2 : Inc YPOS
  273.          Cls 1,0,Screen Height-8 To 624,Screen Height
  274.          Locate 0,TSCRHEIGHT : Print LINE$(L);
  275.          Cup : Curs On 
  276.       End If 
  277.       Inc L
  278.       MV=0
  279.       If Y Curs<TSCRHEIGHT : Locate 0,Y Curs+1
  280.       Else Inc YPOS
  281.       End If 
  282.       LINE$(L)=A2$
  283.       Y=Y Curs
  284.       Def Scroll 3,0,Y*8 To 624,Screen Height,0,8
  285.       Curs Off : Wait Vbl 
  286.       Scroll 3
  287.       Cls 1,0,Y*8-8 To 624,Y*8+8
  288.       Locate 0,Y-1 : Print LINE$(L-1);
  289.       Locate 0,Y : Print LINE$(L);
  290.       If Y<>TSCRHEIGHT : Locate 0,Y+1 : Print LINE$(L+1); : End If 
  291.       Locate 0,Y
  292.       Curs On 
  293.       Clear Key 
  294.    End If 
  295.    
  296.    ' Cursor left
  297.    If A=29 and X>0
  298.       If SS>0 : Locate 0,Y Curs
  299.       Else Cleft 
  300.       End If 
  301.    End If 
  302.    
  303.    ' Cursor right 
  304.    If A=28 and X<Len(LINE$(L))
  305.       If SS>0 : Locate Len(LINE$(L)),Y Curs
  306.       Else Cright 
  307.       End If 
  308.    End If 
  309.    
  310.    ' Cursor up
  311.    If A=30 and L>0
  312.       Dec L
  313.       If Y Curs=1
  314.          Curs Off : Wait Vbl 
  315.          Scroll 1 : Dec YPOS
  316.          Cls 1,0,8 To 624,16
  317.          Locate 0,1 : Print LINE$(L);
  318.          Curs On 
  319.       Else Cup 
  320.       End If 
  321.       If X>Len(LINE$(L)) : X=Len(LINE$(L)) : End If 
  322.       Locate X,Y Curs
  323.       Clear Key 
  324.    End If 
  325.    
  326.    ' Cursor down
  327.    If A=31 and L<LINES
  328.       Inc L
  329.       If Y Curs=TSCRHEIGHT
  330.          Curs Off : Wait Vbl 
  331.          Scroll 2 : Inc YPOS
  332.          Cls 1,0,Screen Height-8 To 624,Screen Height
  333.          Locate 0,TSCRHEIGHT : Print LINE$(L);
  334.          Curs On 
  335.       Else Cdown 
  336.       End If 
  337.       If X>Len(LINE$(L)) : X=Len(LINE$(L)) : End If 
  338.       Locate X,Y Curs
  339.       Clear Key 
  340.    End If 
  341.  
  342.    _CURSPOS
  343.  
  344. End Proc
  345. Procedure _CURSPOS
  346.    X=X Curs : Y=Y Curs
  347.    Locate 70,0 : Paper 2
  348.    Print Using "X ##  ";X;
  349.    Print Using "Y ##";Y
  350.    Locate X,Y : Paper 1
  351. End Proc
  352. Procedure _PRINTFILE[FILE$]
  353.  
  354.    Def Fn SHORTEN$(F$)=Right$(Right$(F$,Len(F$)- Extension_18_0086(F$,"/")),Len(Right$(F$,Len(F$)- Extension_18_0086(F$,":"))))
  355.    Home : Paper 2 : Pen 4
  356.    If FILE$<>"" : Print Fn SHORTEN$(FILE$)
  357.    Else Print "New File"
  358.    End If 
  359.  
  360. End Proc